package cn.ym.system.service.impl;

import cn.ym.basic.service.impl.BaseServiceImpl;
import cn.ym.basic.utils.AssertUtil;
import cn.ym.basic.utils.PageList;
import cn.ym.system.domain.Permission;
import cn.ym.system.domain.Role;
import cn.ym.system.mapper.RoleMapper;
import cn.ym.system.query.RoleQuery;
import cn.ym.system.service.RoleService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

/**
 * 业务层：角色
 */
@Service
public class RoleServiceImpl extends BaseServiceImpl<Role>  implements RoleService {

    @Autowired
    private RoleMapper roleMapper;
    /**
     * 添加
     * @param role
     */
    @Transactional//默认只读为false，默认传播机制为REQUIRED[有且仅有一个事务]
    @Override
    public void add(Role role) {
        AssertUtil.isNotEmpty(role.getName(),"亲：角色名称不能为空");
        AssertUtil.isNotEmpty(role.getSn(),"亲：请输入角色编号");
        roleMapper.add(role);

        //添加当前角色的权限 - 前端一定是选择了权限
        if (role.getPermissions() !=null && role.getPermissions().size()>0){
            roleMapper.addRolePermissions(role);
        }
        //添加当前角色的菜单 - 前端一定是选择了菜单
        if (role.getMenus() !=null && role.getMenus().size()>0){
            roleMapper.addRoleMenus(role);
        }
    }

    /**
     * 修改
     * @param role
     */
    @Transactional//默认只读为false，默认传播机制为REQUIRED[有且仅有一个事务]
    @Override
    public void update(Role role) {
        AssertUtil.isNotEmpty(role.getName(),"亲：角色名称不能为空");
        AssertUtil.isNotEmpty(role.getSn(),"亲：请输入角色编号");
        roleMapper.update(role);

        //删除当前角色的所有权限
        roleMapper.delPermissionByRoleId(role.getId());
        //删除当前角色的所有菜单
        roleMapper.delMenuByRoleId(role.getId());
        //有外键约束，所以先删除关联数据，再删主表数据

        //添加当前角色的权限 - 前端一定是选择了权限
        if(role.getPermissions()!=null && role.getPermissions().size()>0){
            roleMapper.addRolePermissions(role);
        }
        //添加当前角色的菜单 - 前端一定是选择了菜单
        if(role.getMenus()!=null && role.getMenus().size()>0){
            roleMapper.addRoleMenus(role);
        }
    }

    /**
     * 删除
     * @param
     */
    @Transactional
    @Override
    public void delete(Long id) {
        //删除当前角色的所有权限
        roleMapper.delPermissionByRoleId(id);
        //删除当前角色的所有菜单
        roleMapper.delMenuByRoleId(id);
        //有外键约束，所以先删除关联数据，再删主表数据
        super.delete(id);
    }


    @Override
    public void patchDel(Long[] ids) {
        for (Long id : ids) {
            delete(id);
        }

    }
}
